<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    //     输入：nums = [-1,0,1,2,-1,-4]    [-4,-1,-1,0,1,2]
    // 输出：[[-1,-1,2],[-1,0,1]]
    // 解释：
    // nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
    // nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
    // nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
    // 不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
    // 注意，输出的顺序和三元组的顺序并不重要。


    // 输入：nums = [0,1,1]
    // 输出：[]
    // 解释：唯一可能的三元组和不为 0 。

    // 输入：nums = [0,0,0]
    // 输出：[[0,0,0]]
    // 解释：唯一可能的三元组和为 0 。
    /**
     * @param {number[]} nums
     * @return {number[][]}
     */
    /**
     * 循环加 双指针
    */
    function threeSum(nums) {
        let res = []
        let len = nums.length

        let arr = nums.sort((a, b) => a - b)
        for (let i = 0; i < len; i++) {
            //当i大于0的时候 和不可能为0 终止整个循环
            if (arr[i] > 0) break;
            /**
             * 判断下一个数也能 判断i的重复 但是 会影响到 左指针的位置
             */
            if (i > 0 && arr[i] == arr[i - 1]) continue
            let l = i + 1
            let r = len - 1
            while (l < r) {
                let num = arr[i] + arr[l] + arr[r]

                if (num < 0) {
                    l++
                } else if (num > 0) {
                    r--
                } else if (num == 0) {

                    res.push([arr[i], arr[l], arr[r]])

                    //r 和 l的值也不能重复
                    while (l < r && arr[l] == arr[l + 1]) l++
                    while (l < r && arr[r] == arr[r - 1]) r--
                    l++
                    r--
                }
            }
        }
        console.log(res, "=====");
    };

    threeSum([-1, 0, 1, 2, -1, -4])

</script>

</html>